/*
** $Id: lapi.h $
** Lua API 的辅助函数
** See Copyright Notice in lua.h
*/

#ifndef lapi_h
#define lapi_h


#include "llimits.h"
#include "lstate.h"


/* 增加L->top.p，检查是否栈溢出 */
#define api_incr_top(L)	{L->top.p++; \
			 api_check(L, L->top.p <= L->ci->top.p, \
					"stack overflow");}


/*
** 如果调用返回太多的结果，栈可能存储不下，该宏扩展栈空间(L->ci->top.p)
*/
#define adjustresults(L,nres) \
    { if ((nres) <= LUA_MULTRET && L->ci->top.p < L->top.p) \
	L->ci->top.p = L->top.p; }


/* 确保栈至少有 n 个元素 */
#define api_checknelems(L,n) \
	api_check(L, (n) < (L->top.p - L->ci->func.p), \
			  "not enough elements in the stack")


/*
** 为了减少从C函数返回的开销, 这些函数中的待关闭变量被编码在CallInfo的字段'nresults'中,
** 这意味着，如果没有待关闭的变量，那么函数返回0、1或“all”期望的结果都不会有额外的开销。
** 对于其他期望结果数量的函数，以及有变量待关闭的函数，会有一个额外的检查。
*/

#define hastocloseCfunc(n)	((n) < LUA_MULTRET)

/* Map [-1, inf) (range of 'nresults') into (-inf, -2] */
#define codeNresults(n)		(-(n) - 3)
#define decodeNresults(n)	(-(n) - 3)

#endif
